﻿/*******************************************************************************
 * Copyright © 2016-2020 北京网非科技有限公司 版权所有
 * Author: 北京网非科技有限公司
 * Description: 网非快速开发平台NET
 * Website：http://www.wfdot.com
*********************************************************************************/
using CubicFWNet.Data.SystemManage.Model;
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.ModelConfiguration;
using System.Linq;
using System.Reflection;

namespace CubicFWNet.Data
{
    //[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
    public partial class CubicFWNetContext : DbContext
    {

        static CubicFWNetContext()
        {
            //Database.SetInitializer<CubicFWNetContext>(null);
            //Database.SetInitializer(new DropCreateDatabaseIfModelChanges<CubicFWNetContext>());
        }

        //public CubicFWNetContext(): base("Name=CubicFWNetContext")
        public CubicFWNetContext(): base(ConnectionConfigPara.EFDBConnection)
        {
            /**
            * http://www.cnblogs.com/linfei721/archive/2013/06/07/3123579.html
            * EF默认会自动的跟踪数据的变化，当变更的数据量较大的时候，EF的跟踪工作量就会骤增，但指定操作变得非常缓慢
            * （这也是部分同学怀疑EF的性能问题的一个怀疑点），其实，只要在批量操作的时候把自动更新关闭，即可解决缓慢的问题。
            * Entity Framework 5.0才有
            * 
            * http://www.cnblogs.com/nianming/archive/2013/06/07/3123103.html
            * 另外一个解决办法就是使用DbSet<T>.AddRange方法，这个方法是在6.0 beta1中加入的。
            * **/
            this.Configuration.AutoDetectChangesEnabled = false;
            /**
             * 是否在保存时验证实体有效性
             * **/
            this.Configuration.ValidateOnSaveEnabled = false;
            /**
             * http://www.cnblogs.com/liangxiaofeng/p/5809301.html
             * EF默认使用延迟加载获取导航属性关联的数据
             * 关闭Lazy Loading，可以将LazyLoadingEnabled设为false，如果导航属性没有标记为virtual，Lazy Loading也是不起作用的。
             * 
             * **/
            this.Configuration.LazyLoadingEnabled = false;
            /**
             * http://www.cnblogs.com/Gyoung/p/3153875.html
             * WCF  EF 
             * **/
            this.Configuration.ProxyCreationEnabled = false;

        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {            
            /*
             * 刘立军 2017-1-9
             * 通过反射的方法自动添加添加自定的映射配置类对象，第一次使用时慢点，但是大大方便了开发
             * 可以使用反射将程序集中所有的EntityTypeConfiguration<>一次性添加到modelBuilder.Configurations集合中，
             * 这样，OnModelCreating就大大简化，并且一劳永逸的是，以后添加新的实体映射只需要添加新的继承自EntityTypeConfiguration<>的XXXMap类而不需要修改OnModelCreating方法。
             * */
            //var typesToRegister = Assembly.GetExecutingAssembly().GetTypes().Where(type => !String.IsNullOrEmpty(type.Namespace))
            //.Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));
            //foreach (var type in typesToRegister)
            //{
            //    dynamic configurationInstance = Activator.CreateInstance(type);
            //    modelBuilder.Configurations.Add(configurationInstance);
            //}
            base.OnModelCreating(modelBuilder);
        }

    }
}
